
package gewu.suleju.util;

import gewu.suleju.model.pojo.BrokerInfo;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import java.util.Date;
public class BrokerJWTUtil {
    /**
     * 设置过期时间,一周
     */
    private static final long EXPIRE = 7 * 24 * 60 * 60 * 1000;
    // private static final long EXPIRE = 30 * 1000;

    /**
     * 设置秘钥
     * 盐的作用
     */
    private static final String SECRET = "success";//盐值

    /**
     * 令牌前缀
     */
    private static final String TOKEN_PREFIX = "suleju";

    /**
     * 令牌主题 - 瞎写的
     */
    private static final String SUBJECT = "gewu";

    /**
     * 根据经纪人信息来生成令牌(brokerToken)
     * @param broker
     * @return
     */
    public static String geneJsonWebToken(BrokerInfo broker){//这里需要加载荷，也就是需要加密的数据
        //1. 省略了头部 - base64算法,typ:jwt

        String brokerToken = Jwts.builder().setSubject(SUBJECT)

                .claim("brokerId",broker.getId())//载荷 - 有效信息 - 登录用户的有效信息,是为了校验用户是否登录的信息
                .claim("brokerName",broker.getBrokerName())


                .setIssuedAt(new Date())//颁布时间
                //过期时间
                .setExpiration(new Date(System.currentTimeMillis() + EXPIRE))

                //生成签名 - token值
                //HMACSHA256(base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)
                .signWith(SignatureAlgorithm.HS256,SECRET).compact();//签名

        brokerToken = TOKEN_PREFIX + brokerToken;//前缀都是为了安全
        return brokerToken;
    }

    /**
     * 校验token的方法
     * @param brokerToken
     * @return
     */
    public static Claims checkJWT(String brokerToken){
        try{
            final Claims claims = Jwts.parser().setSigningKey(SECRET)
                    .parseClaimsJws(brokerToken.replace(TOKEN_PREFIX,"")).getBody();

            return claims;

        }catch (Exception e){
            return null;
        }
    }
}